package controller;

import entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.*;
import java.util.Map;

/**
 * Author:shixiaojun@itany.com
 * Date:2022/3/11 10:31
 * Version:1.0-SNAPSHOT
 */
@Controller
@RequestMapping("/param")
public class ParamController {

    @RequestMapping("/f1")
    public void f1(HttpServletRequest request, HttpServletResponse response, HttpSession session){
        System.out.println("ParamController.f1");
    }

    // 报错,application不能直接作为方法参数
    @RequestMapping("/f2")
    public void f2(ServletContext application){
        System.out.println("ParamController.f2");
    }

    @RequestMapping("/f3")
    public void f3(HttpServletRequest request){
        ServletContext application = request.getServletContext();
        String path = application.getRealPath("");
        System.out.println("path:"+path);
    }

    @RequestMapping("/f4")
    public void f4(HttpSession session){
        ServletContext application = session.getServletContext();
        String path = application.getRealPath("");
        System.out.println("path:"+path);
    }

    @RequestMapping("/f5")
    public void f5(InputStream in, OutputStream out){
        System.out.println("ParamController.f5");
    }

    @RequestMapping("/f6")
    public void f6(Reader reader, Writer writer, PrintWriter out){
        System.out.println("ParamController.f6");
    }

    // 报错,同一种类型的字节流与字符流的参数不能存在于同一个方法中
    @RequestMapping("/f7")
    public void f7(InputStream in,Reader reader){
        System.out.println("ParamController.f6");
    }

    @RequestMapping("/f8")
    public String f8(Model model, Map map, ModelMap modelMap){
        // 在Handler中,可以使用model、map、modelMap进行数据传递
        // 三个对象效果一致,只是方法不一样
        model.addAttribute("model","Hello Model");
        map.put("map","Hello Map");
        // ModelMap即可以使用model的方法,也可以使用map的方法
        modelMap.addAttribute("modelMap1","Hello ModelMap-Model");
        modelMap.put("modelMap2","Hello ModelMap-Map");
//        return "model";
        return "redirect:/showModel";
        // 当重定向之后,页面通过作用域的方式获取数据时,数据丢失
        // 但是此时地址栏出现了变化
        // http://localhost:8080/showModel?model=Hello+Model&map=Hello+Map&modelMap1=Hello+ModelMap-Model&modelMap2=Hello+ModelMap-Map
        // ?model=Hello+Model
        // &map=Hello+Map
        // &modelMap1=Hello+ModelMap-Model
        // &modelMap2=Hello+ModelMap-Map
        // 此时发现丢失的数据以?传参的方式进行了传递
        // 既然数据以?传参的方式进行了传递,那么我们在前台仍然可以获取到对应的数据
    }

    @RequestMapping("/f9")
    public void f9(User user){
        System.out.println(user);
    }

    // 当参数是一个对象的时候
    // Handler方法对参数进行处理的时候
    // 会将参数对象中所有的属性提取出来
    // 与当前请求中所有数据的key进行装配
    // 当属性名与数据的key一致的时候
    // 会将对应的数据装配到对应的属性中
    @RequestMapping("/f10")
    public void f10(Integer id,String username,String password,String phone,String address){
        User user = new User(id,username,password,phone,address);
        System.out.println(user);
    }

}
